package logic.blocks;

import java.awt.Rectangle;
import java.awt.geom.Line2D;

import logic.characters.Player;
import logic.enemies.Enemy;
import logic.entities.Background;
import logic.entities.GameObject;
import logic.pruebas.GamePanel;

/**
 * @author Unai
 * Calse abstract base para los bloques
 *
 */
public abstract class Block extends GameObject {
	private static final long serialVersionUID = -5238460621756481007L;
	public boolean playerOnThis = false;
	public boolean enemyOnThis = false;
	public boolean relevant = true;
	protected float velX;
	protected float velY;
	@SuppressWarnings("unused")
	private Player player;
	private float initXCoord;
	private float initYCoord;

	/**
	 * @param x
	 * @param y
	 * @param panel
	 * @param nomImg
	 * @param player
	 */
	public Block(float x, float y, GamePanel panel, String nomImg, Player player) {
		super(x, y, panel, nomImg);
		this.player = player;
		dead = false;
		initXCoord = coorX;
		initYCoord = coorY;
		collisionX = coorX;
		collisionY = coorY;
		collisionWidth = anchura;
		collisionHeight = altura;
	}

	/**
	 * @param object
	 * Evalua si ha impactado con algo, por que lado y ejecuta distintas sentencias en funcion del bloque
	 */
	public void impact(GameObject object) {
		if (dibujado) {
			if (object.dibujado && !object.dead) {
					Line2D pUp = new Line2D.Float(object.collisionX + 5, object.collisionY, object.collisionX + object.collisionWidth - 7, object.collisionY);
					Line2D pDown = new Line2D.Float(object.collisionX + 5, object.collisionY + object.collisionHeight, object.collisionX + object.collisionWidth - 7, object.collisionY + object.collisionHeight);
					Line2D pLeft = new Line2D.Float(object.collisionX, object.collisionY + 5, object.collisionX, object.collisionY + object.collisionHeight - 7);
					Line2D pRight = new Line2D.Float(object.collisionX + object.collisionWidth, object.collisionY + 5, object.collisionX + object.collisionWidth, object.collisionY + object.collisionHeight - 7);
					Rectangle thisObject = new Rectangle((int)coorX, (int)coorY, anchura, altura);

					if (pDown.intersects(thisObject)) {
						if (object instanceof Player) {
							Player tempP = (Player) object;
							downImpact(tempP);
						} else if (object instanceof Enemy) {
							Enemy tempE = (Enemy) object;
							downImpact(tempE);
						}
					} else if (pUp.intersects(thisObject)) {
						if (object instanceof Player) {
							Player tempP = (Player) object;
							upImpact(tempP);
						} else if (object instanceof Enemy) {
							Enemy tempE = (Enemy) object;
							upImpact(tempE);
						}
					} else if (pLeft.intersects(thisObject)) {
						if (object instanceof Player) {
							Player tempP = (Player) object;
							leftImpact(tempP);
						} else if (object instanceof Enemy) {
							Enemy tempE = (Enemy) object;
							leftImpact(tempE);
						}
					} else if (pRight.intersects(thisObject)) {
						if (object instanceof Player) {
							Player tempP = (Player) object;
							rightImpact(tempP);
						} else if (object instanceof Enemy) {
							Enemy tempE = (Enemy) object;
							rightImpact(tempE);
						}
					} else {
						if (object instanceof Player) {
							if (playerOnThis) {
							Player tempP = (Player) object;
							if (!tempP.attacking && !tempP.special && !tempP.throwing) {
								if ((object.collisionX + object.collisionWidth < coorX) || (object.collisionX > coorX + anchura)) {
									endCollision(tempP);
								}
							}
							}

						} else if (object instanceof Enemy) {
							if (enemyOnThis) {
								Enemy tempE = (Enemy) object;
							if ((tempE.collisionX + tempE.collisionWidth < collisionX) || (tempE.collisionX > coorX + anchura) ) {
								endCollision(tempE);
								}
							}
						}
					}
			}
		}
	}
	
	/**
	 * @param player
	 * Hace que el jugador empiece a caer
	 */
	public void endCollision(Player player) {
		player.onPlatform = false;
		playerOnThis = false;
	}
	
	/**
	 * @param enemy
	 * Hace que el enemigo empiece a caer
	 */
	public void endCollision(Enemy enemy) {
		enemy.onPlatform = false;
		enemy.falling = true;
		enemyOnThis = false;
	}


	
	/**
	 * @param background
	 * Recoloca el objeto en pantalla en funcion del background
	 */
	public void update(Background background) {
		coorX = background.coorX + initXCoord;
		coorY = background.coorY + initYCoord;
		collisionX = coorX;
		collisionY = coorY;
				dibujar();
	}

	/**
	 * @param player
	 * Efecto del choque si el jugador lo toca por debajo
	 */
	public abstract void upImpact(Player player);
	/**
	 * @param player
	 * Efecto del choque si el jugador lo toca por arriba
	 */
	public abstract void downImpact(Player player);
	/**
	 * @param player
	 * Efecto del choque si el jugador lo toca por la derecha
	 */
	public abstract void leftImpact(Player player);
	/**
	 * @param player
	 * efecto del choque si el jugador lo toca por la izquierda
	 */
	public abstract void rightImpact(Player player);
	
	/**
	 * @param enemy
	 * Efecto sobre los enemigos que lo tocan por debajo
	 */
	public abstract void upImpact(Enemy enemy);
	/**
	 * @param enemy
	 * Efecto sobre los enemigos que lo tocan por encima
	 */
	public abstract void downImpact(Enemy enemy);
	/**
	 * @param enemy
	 * Efecto sobre los enemigos que lo tocan por la derecha
	 */
	public abstract void leftImpact(Enemy enemy);
	/**
	 * @param enemy
	 * Efecto sobre los enemigos que lo tocan por la izquierda
	 */
	public abstract void rightImpact(Enemy enemy);

}
